#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <vector>
#include <cstring>

pthread_cond_t g_cond = PTHREAD_COND_INITIALIZER;                            // 全局条件变量
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; // 全局互斥锁


// struct pakage
// {
//     pakage()
//     {
//         pthread_mutex_init(&_mutex,nullptr);
//         pthread_cond_init(&_cond,nullptr);
//     }

//     ~pakage()
//     {
//         pthread_mutex_destroy(&_mutex);
//         pthread_cond_destroy(&_cond);
//     }
//     pthread_cond_t _cond;
//     pthread_mutex_t _mutex;
// };

void* func(void* input)
{
    const char* ch = static_cast<const char*>(input);
    while(true)
    {
        pthread_mutex_lock(&g_mutex);

        pthread_cond_wait(&g_cond,&g_mutex);
        std::cout << ch << std::endl;

        pthread_mutex_unlock(&g_mutex);
    }
}

int main()
{
   //pakage* p = new pakage();

    pthread_t tid1,tid2;
    pthread_create(&tid1,nullptr,func,(void*)"我是线程A");

    while(true)
    {
        sleep(1);
        std::cout << "我是线程B" << std::endl;
        pthread_cond_signal(&g_cond);
    }
    return 0;
}





//条件变量基本使用 : 全部休眠->依次唤醒
// void *routine(void *input)
// {
//     char* ch = static_cast<char*>(input);

//     pthread_mutex_lock(&g_mutex);

//     std::cout << ch << ",开始等待啦\n";
//     pthread_cond_wait(&g_cond, &g_mutex);
//     std::cout << ch << ",等待结束,继续!!!\n";

//     pthread_mutex_unlock(&g_mutex);
//     return nullptr;
// }
// int main()
// {
//     std::vector<pthread_t> v;

//     for (int i = 0; i < 4; i++)
//     {
//         pthread_t tid;
//         //char ch[64];
//         char* ch = new char[64];
//         snprintf(ch,64,"我是线程%d",i);
//         pthread_create(&tid, nullptr, routine, (void*)ch);
//         v.push_back(tid);
//     }
//     sleep(2);
//     for (int i = 0; i < 4; i++)
//     {
//         pthread_cond_signal(&g_cond);
//         sleep(1);
//     }
//     return 0;
// }
